/*!
 * # 参数列表实体类:
 *  Receivers - 接收人列表
 * 
 * # 描述:
 *  根据名称搜索通知接收人，用于在发送新通知消息时选择接收人。
 * 
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using Pittypat;

namespace Waln.Notifying.Creating.Args
{
    /// <summary>
    /// 功能 接收人列表 的参数列表。
    /// </summary>
    [global::Pittypat.Function(Transaction = false)]
    public sealed class Receivers : global::Pittypat.FunctionArgs
    {
        #region 构造函数

        /// <summary>
        /// 初始化 Receivers 类的一个新实例。
        /// </summary>
        public Receivers()
        {
            // 页码
            this.PageIndex = null;
            // 页面尺寸
            this.PageSize = null;
            // 总行数
            this.TotalRows = null;
            // 排序名称
            this.OrderName = null;
            // 排序方向
            this.OrderDirection = null;
            // 用户 Id
            this.UserId = null;
            // 接收人名称
            this.Name = null;
            // 接收人列表
            this.List = null;
        }

        #endregion

        #region 属性

        /// <summary>
        /// 获取或者设置页码。
        /// </summary>
        /// <remarks>
        /// 分页查询时的页码，从 1 开始。
        /// </remarks>
        [global::Pittypat.Parameter(0, Role = global::Pittypat.ParameterRole.PageIndex)]
        public @int64? PageIndex { get; set; }

        /// <summary>
        /// 获取或者设置页面尺寸。
        /// </summary>
        /// <remarks>
        /// 分页查询时每页最多包含的行数，最小值为 1。
        /// </remarks>
        [global::Pittypat.Parameter(1, Role = global::Pittypat.ParameterRole.PageSize)]
        public @int64? PageSize { get; set; }

        /// <summary>
        /// 获取或者设置总行数。
        /// </summary>
        /// <remarks>
        /// 分页查询时向客户端返回符合条件的总行数，用于分页设置。
        /// </remarks>
        [global::Pittypat.Parameter(2, Direction = global::Pittypat.ParameterDirection.Out, Role = global::Pittypat.ParameterRole.TotalRows)]
        public @int64? TotalRows { get; set; }

        /// <summary>
        /// 获取或者设置排序名称。
        /// </summary>
        /// <remarks>
        /// 排序列的标识符名称。
        /// </remarks>
        [global::Pittypat.Parameter(3, Role = global::Pittypat.ParameterRole.OrderName, MaxLength = 50)]
        public @string? OrderName { get; set; }

        /// <summary>
        /// 获取或者设置排序方向。
        /// </summary>
        /// <remarks>
        /// 排序的方向：ASC 或 DESC。
        /// </remarks>
        [global::Pittypat.Parameter(4, Role = global::Pittypat.ParameterRole.OrderDirection, MaxLength = 4)]
        public @string? OrderDirection { get; set; }

        /// <summary>
        /// 获取或者设置用户 Id。
        /// </summary>
        /// <remarks>
        /// 当前用户的 Id，由系统自动设置该参数。
        /// </remarks>
        [global::Pittypat.Parameter(5, Role = global::Pittypat.ParameterRole.UserId)]
        public @uuid? UserId { get; set; }

        /// <summary>
        /// 获取或者设置接收人名称。
        /// </summary>
        /// <remarks>
        /// 按照接收人的名称对接收人列表进行过滤。如果没有提供名称，则认为查询所有的用户，如果系统用户比较多，这可能比较耗时，并且列表会很长，因此应该尽量使用名称对接收人列表进行过滤。
        /// </remarks>
        [global::Pittypat.Parameter(6, MaxLength = 30)]
        public @string? Name { get; set; }

        /// <summary>
        /// 获取或者设置接收人列表。
        /// </summary>
        /// <remarks>
        /// 根据接收人名称搜索到的符合条件的接收人列表。
        /// </remarks>
        [global::Pittypat.Parameter(7, Direction = global::Pittypat.ParameterDirection.Out)]
        public global::Pittypat.DataList<global::Waln.Notifying.Creating.Data.Receiver> List { get; set; }

        /// <summary>
        /// 获取或者设置指定名称的参数值。
        /// </summary>
        /// <param name="name">参数名称，不区分大小写。</param>
        /// <returns>目标名称的参数值。如果参数不存在，则返回 null。</returns>
        /// <exception cref="global::System.ArgumentException">设置参数值时发现参数不存在。</exception>
        public override object this[string name]
        {
            get
            {
                if (string.IsNullOrEmpty(name))
                {
                    return null;
                }

                switch (name.ToLower())
                {
                    case "pageindex":
                        return this.PageIndex;
                    case "pagesize":
                        return this.PageSize;
                    case "totalrows":
                        return this.TotalRows;
                    case "ordername":
                        return this.OrderName;
                    case "orderdirection":
                        return this.OrderDirection;
                    case "userid":
                        return this.UserId;
                    case "name":
                        return this.Name;
                    case "list":
                        return this.List;
                    default:
                        return null;
                }
            }
            set
            {
                if (string.IsNullOrEmpty(name))
                {
                    throw new global::System.ArgumentException("没有提供有效的参数名称。", "name");
                }

                switch (name.ToLower())
                {
                    case "pageindex":
                        this.PageIndex = (@int64?)value;
                        break;
                    case "pagesize":
                        this.PageSize = (@int64?)value;
                        break;
                    case "totalrows":
                        this.TotalRows = (@int64?)value;
                        break;
                    case "ordername":
                        this.OrderName = (@string?)value;
                        break;
                    case "orderdirection":
                        this.OrderDirection = (@string?)value;
                        break;
                    case "userid":
                        this.UserId = (@uuid?)value;
                        break;
                    case "name":
                        this.Name = (@string?)value;
                        break;
                    case "list":
                        this.List = (global::Pittypat.DataList<global::Waln.Notifying.Creating.Data.Receiver>)value;
                        break;
                    default:
                        throw new global::System.ArgumentException(name + " 不是 " + this.GetType().Name + " 的有效参数属性名称。", "name");
                }
            }
        }

        #endregion

        #region 方法

        /// <summary>
        /// 将当前对象作为 JSON 字符串写入指定的文本流。
        /// </summary>
        /// <param name="writer">目标文本流。</param>
        /// <exception cref="global::System.ArgumentNullException">writer 是 null。</exception>
        public override void Write(global::System.IO.TextWriter writer)
        {
            if (writer == null)
            {
                throw new global::System.ArgumentNullException("writer");
            }

            writer.Write('{');

            // 页码
            writer.Write("\"pageIndex\":");
            this.PageIndex.Write(writer);
            writer.Write(',');

            // 页面尺寸
            writer.Write("\"pageSize\":");
            this.PageSize.Write(writer);
            writer.Write(',');

            // 总行数
            writer.Write("\"totalRows\":");
            this.TotalRows.Write(writer);
            writer.Write(',');

            // 排序名称
            writer.Write("\"orderName\":");
            this.OrderName.Write(writer);
            writer.Write(',');

            // 排序方向
            writer.Write("\"orderDirection\":");
            this.OrderDirection.Write(writer);
            writer.Write(',');

            // 用户 Id
            writer.Write("\"userId\":");
            this.UserId.Write(writer);
            writer.Write(',');

            // 接收人名称
            writer.Write("\"name\":");
            this.Name.Write(writer);
            writer.Write(',');

            // 接收人列表
            writer.Write("\"list\":");
            if (this.List == null)
            {
                writer.Write("null");
            }
            else
            {
                this.List.Write(writer);
            }

            writer.Write('}');
        }

        #endregion
    }
}
